又是碰到組合語言的題目了,這種題目就只能自己看沒辦法利用ghidra的decompile
不過這類的題目都不是很難,基礎的觀念有了就很容易~
這題要我們解出asm3(0xfac0f685,0xe0911505,0xaee1f319)的傳回值是多少
這邊先把一開始的stack畫出來
這邊介紹一下暫存器的部份,一般在我們的電腦暫存器是64 bits但我們有時不需要用到這麼大的
以rax做範例,可以看到不同大小有不同的名稱,這題就會運用到這個觀念,我們直接來看看吧
以下就會針對一個一個指令做講解,所使用到的表格就是一個32 bits的暫存器
mov eax,0x27
這裡直接將0x27填入就好
0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0010 | 0111 |
---|
xor al,al
自己對自己做xor就是全部歸零的意思,而且這邊我們也只有用到al,所以就是整個暫存器又回到0
0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 |
---|
mov ah,BYTE PTR [ebp+0xb]
[ebp+0xb]這又是什麼呢,他所代表的是[ebp+0x8]這個數字中的fa
還記得之前介紹過intel是使用littel endian
的方式嗎,所以在記憶體中 0xfac0f685 這段數字的順序是
ebp+8 85
ebp+9 f6
ebp+a c0
ebp+b fa
將fa放到ah的位子
0000 | 0000 | 0000 | 0000 | 1111 | 1010 | 0000 | 0000 |
---|
sal ax,0x10
sal是算術左移指令,不過這邊要注意,他是ax左移16個
會造成溢位,所以整串又變成0了
0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 |
---|
但這邊若是 sal eax,0x10
就會變成以下這樣,我一開始解的時候也沒注意看難怪怎麼提交都錯XD
1111 | 1010 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 |
---|
sub al,BYTE PTR [ebp+0xc]
跟上面的意思一樣 [ebp+0xc]這個Byte的值是 05 不過因為目前al的值是0所以這邊可以將他視為-5
-5在二補數表示方式是
0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 1111 | 1011 |
---|
add ah,BYTE PTR [ebp+0xf]
[ebp+0xf]這個Byte的值是 e0
0000 | 0000 | 0000 | 0000 | 1110 | 0000 | 1111 | 1011 |
---|
xor ax,WORD PTR [ebp+0x12]
這邊要看清楚他是從[ebp+0x12]取一個word一個word是2個bytes的意思
ae , e1這兩個bytes
這個word 表示的方式如下
0000 | 0000 | 0000 | 0000 | 1010 | 1110 | 1110 | 0001 |
---|
與我們的ax做xor運算
運算完的結果如下
0000 | 0000 | 0000 | 0000 | 0100 | 1110 | 0001 | 1010 |
---|
這個結果就是最終傳回的值 0x4e1a
記得提交的時候要加上 picoCTF{0x4e1a}